package cn.kgc.spring.day03.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author 课工场
 * @date 2024/11/6
 * @description  jdk代理的工具类  通过该类可以获取某个类的代理对象
 */
public class JDKProxy {

    // 被代理对象
    private Object obj;

    public JDKProxy(Object obj){
        this.obj = obj;
    }


    //  生成代理对象
    public Object  createObjProxy(){

      /*
      * ClassLoader loader,      类加载器     可以加载类对象实现对象的创建
        Class<?>[] interfaces,   被代理对象实现的所有接口
        InvocationHandler h      增强的业务功能封装的对象
      * */
        // 获取类加载器
        ClassLoader classLoader = this.getClass().getClassLoader();

        // 获取被代理对象实现的所有接口   基于接口的代理  反射
        Class<?>[] interfaces = obj.getClass().getInterfaces();

        // 增强的业务功能封装的对象
        InvocationHandler   invocationHandler = new InvocationHandler() {

            //  Object proxy  代理对象  Method method  代理对象调用的方法对象    Object[] args   代理对象调用的方法对象的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                System.out.println("上课时间到了,请开始上课...");

                // 被代理对象方法的执行
                Object invoke = method.invoke(obj, args);

                System.out.println("下课时间到了,请准时下课...");

                return invoke;
            }
        };

        Object o = Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);

        return o;
    }


}
